"""
寻找宿舍门的密码:
今天早上，你的室友因为睡过头被锁在了宿舍里。
宿舍的门安装了一把高级密码锁。
当尝试解锁时，锁会生成一串包含随机英文字母和数字的字符串。为了解锁，你需要从这串字符串中找出所有的数字，按大小排序后组合成一个整数。
此外，你还需要获取所有室友当前位置的经纬度，并将经纬度的小数部分相加。
然后，你需要将这个整数与经纬度小数部分的和相乘，取结果的前8位数字作为解锁密码。

先编写一个 gen_txt 函数，它会生成一个包含100位随机英文数字字符的字符串，其中包含10位数字。
然后请编写一个名为 unlock_door 的函数，它接受上面生成的随机字符串和一个包含室友经纬度的列表，并返回一个字符串作为解锁密码。

例如：
random_string = gen_txt()
locations = [(120.12345, 30.04321), (121.03456, 31.95678), (122.04567, 32.06789)]   # 3个舍友的经度，纬度
password = unlock_door(random_string, locations)
print(password)
"""
import random
import string


def gen_txt(length=100, num_count=10):
    """
    生成包含随机字母和数字的字符串

    Args:
        length: 字符串总长度（默认100）
        num_count: 数字的数量（默认10）

    Returns:
        str: 生成的随机字符串
    """
    try:
        # 验证输入参数
        if not isinstance(length, int) or length < num_count:
            raise ValueError("总长度必须是大于数字数量的整数")
        if not isinstance(num_count, int) or num_count < 1:
            raise ValueError("数字数量必须是正整数")

        # 生成指定数量的随机数字
        numbers = [str(random.randint(0, 9)) for _ in range(num_count)]

        # 生成剩余的随机字母
        letters = [random.choice(string.ascii_letters)
                   for _ in range(length - num_count)]

        # 合并并打乱所有字符
        all_chars = numbers + letters
        random.shuffle(all_chars)

        return ''.join(all_chars)

    except Exception as e:
        print(f"生成随机字符串时出错: {str(e)}")
        return ""


def unlock_door(lock_string, coordinates):
    """
    根据锁字符串和经纬度生成解锁密码

    Args:
        lock_string: 锁生成的随机字符串
        coordinates: 包含经纬度的列表，格式为[(lat1, lon1), (lat2, lon2), ...]

    Returns:
        str: 8位解锁密码
    """
    try:
        # 提取并排序数字
        numbers = sorted(int(c) for c in lock_string if c.isdigit())
        if not numbers:
            raise ValueError("字符串中未找到数字")

        # 组合成整数
        combined_num = int(''.join(map(str, numbers)))

        # 计算经纬度小数部分之和
        decimal_sum = 0
        for lat, lon in coordinates:
            # 获取小数部分
            lat_decimal = abs(lat - int(lat))
            lon_decimal = abs(lon - int(lon))
            decimal_sum += lat_decimal + lon_decimal

        # 计算最终结果
        result = combined_num * decimal_sum

        # 转换为字符串并取前8位
        password = str(int(result))[:8]

        # 如果不足8位，在前面补0
        return password.zfill(8)

    except Exception as e:
        print(f"生成密码时出错: {str(e)}")
        return "00000000"


def main():
    # 测试用例
    test_cases = [
        # 正常情况
        [(39.915, 116.404), (31.230, 121.474)],  # 北京和上海的经纬度
        # 整数经纬度
        [(40.0, 116.0), (31.0, 121.0)],
        # 单个坐标
        [(39.915, 116.404)],
    ]

    print("开始测试门锁解密程序...\n")

    for coords in test_cases:
        try:
            # 生成随机锁字符串
            lock_string = gen_txt()
            print(f"锁生成的字符串: {lock_string}")
            print(f"室友位置: {coords}")

            # 生成密码
            password = unlock_door(lock_string, coords)
            print(f"解锁密码: {password}\n")

        except Exception as e:
            print(f"测试出错: {str(e)}\n")


if __name__ == "__main__":
    main()


